[アップデート] アベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました
こんにちは!AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。
Amazon ECS でアベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました。
控えめに言って神ですね。早速アップデートの内容に入っていきましょう。
何が嬉しいのか
まず初めに on EC2, on Fargate かかわらず、ECS タスクを複数のアベイラビリティゾーンで均等に分散する仕組みはベストエフォートです。
EC2
Task placement strategies are a best effort. Amazon ECS still attempts to place tasks even when the most optimal placement option is unavailable. However, task placement constraints are binding, and they can prevent task placement.
Fargate
Task placement strategies and constraints aren't supported for tasks using the Fargate launch type. Fargate will try its best to spread tasks across accessible Availability Zones. If the capacity provider includes both Fargate and Fargate Spot, the spread behavior is independent for each capacity provider.
この仕様があるため、 ECS タスクをアベイラビリティゾーンごとに厳格に均等配置したい場合、自前でタスクを置き換えるような仕組みの実装が必要でした。たとえば次のような例です。
- EventBridge Scheduler, Step Functions 等で定期的にタスクの偏りが発生していないかチェック、再配置する仕組みの実装
- 負荷が低い時間帯で、 ECS タスクの Desired Count を増加させ、 Application Auto Scaling のスケールインで再配置を行う
ただし、必ず 1 回で成功するかと言われると、先ほどのベストエフォートに従うため言い切れず、ベストエフォートなスケジューリングのチャンスを増やすイメージです。
今回のアップデートで、この仕組みの実装がマネージドで利用可能になりました。(嬉しい)
アップデート内容
ECS サービスに availabilityZoneRebalancing
プロパティが追加されました。プロパティ 1 つで実装できるのいいですね。(既存の ECS サービスにも適用可能です。)
availabilityZoneRebalancing
Indicates whether to use Availability Zone rebalancing for the service.
For more information, see Balancing an Amazon ECS service across Availability Zones in the Amazon Elastic Container Service Developer Guide.
Type: String
Valid Values:ENABLED
|DISABLED
Required: No
CreateService - Amazon Elastic Container Service
UpdateService - Amazon Elastic Container Service
ただし、いくつか制約事項があります。設定変更前に合わせて確認しておきましょう。
利用可能な状態
- on Fargate
deploymentConfiguration
のmaximumPercent
の値が 100% より大きいこと(デフォルトは 200 %)
- on EC2
deploymentConfiguration
のmaximumPercent
の値が 100% より大きいこと(デフォルトは 200 %)- スケジューリングに Replica 戦略を利用する ECS サービス
placementStrategy
を指定していないplacementStrategy
の最初の項目にattribute:ecs.availability-zone
がspread
で指定している (※1)
※1 の OK, NG の例は以下になります。
OK
"placementStrategy": [
{
"field": "attribute:ecs.availability-zone",
"type": "spread"
},
{
"field": "memory",
"type": "binpack"
}
]
NG
"placementStrategy": [
{
"field": "memory",
"type": "binpack"
},
{
"field": "attribute:ecs.availability-zone",
"type": "spread"
}
]
利用不可な状態
- on EC2
- スケジューリングに Daemon 戦略を利用する ECS サービス
- 起動タイプが ECS Anywhere (
EXTERNAL
) を利用していること
- Classic Load Balancer を使っていること
やってみる
今回は ECS タスク数がアベイラビリティゾーンごとに偏りのある、 ECS サービスを作成し availabilityZoneRebalancing
を有効にして挙動を確認してみます。
まずは偏りのある ECS サービスを作成します。今回は us-east-1 リージョンを使いました。ARM コンテナを使っています。
起動しているタスク数が 12, アベイラビリティゾーンが 6 の状態に対して、 us-east-1a
に 3 つのタスク、 us-east-1f
に 4 つのタスク、us-east-1c
に 1 つのタスク、us-east-1e
はタスク数 0 と偏りが生じていますね。
私の場合、 us-east-1e
が use1-az3
だったため、サポートしていないリージョンとして、タスク数 0 は想定で通りです。
- For the Fargate launch type, the following AWS Regions do not support 64-bit ARM workloads:
- US East (N. Virginia), the use1-az3 Availability Zone
執筆時点の CloudShell が v2.21.2 だったため、 v2.22.2 まで引き上げます。
[cloudshell-user@ip-10-136-53-47 ~]$ aws --version
aws-cli/2.21.2 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
v2.22.2 以上になっていれば OK です。
[cloudshell-user@ip-10-136-53-47 ~]$ aws --version
aws-cli/2.22.4 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023
現在値を見ると availabilityZoneRebalancing
は無効化されている状態です。
[cloudshell-user@ip-10-136-53-47 ~]$ aws ecs describe-services --services ecs --cluster ecs --query services[0].availabilityZoneRebalancing
"DISABLED"
更新してみる
それでは、 availabilityZoneRebalancing
を ENABLED
に変更してみます。
aws ecs update-service \
--service ecs \
--cluster ecs \
--availability-zone-rebalancing "ENABLED"
すぐに有効できました。
[cloudshell-user@ip-10-136-53-47 ~]$ aws ecs describe-services --services ecs --cluster ecs --query services[0].availabilityZoneRebalancing
"ENABLED"
また、マネジメントコンソールからも設定値を確認できますね。
サービスのリバランス
初回デプロイから 15 分後ほど経過したのちに、 ECS タスクの AZ 不均衡を検知していました。
us-east-1e
はサポートしていないよ!と怒られていますね。
イメージしていた us-east-1f
のタスクが 1 つ減少し、us-east-1c
に 1 つタスクが増加していますね。
なお、アベイラビリティゾーン間のタスク再調整イベントは、タスク状態変更で次の stoppedReason が拾えるようです。
Availability Zone rebalancing initiated by (deployment ecs-svc/deployment-id)
まとめ
以上、「Amazon ECS でアベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました。」でした。
個人的には、デメリットほぼない機能だと思いますので、多くの方が有効になるアップデートだと思います。
このブログがどなたかの参考になれば幸いです。
AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!